package com.melody.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.melody.entry.*;
import com.melody.model.vo.MusicDetailsVo;
import com.melody.service.MusicCommentService;
import com.melody.service.MusicInfoService;
import com.melody.service.MusicLyricService;
import io.swagger.models.auth.In;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;


@RestController
@RequestMapping("/music")
public class MusicInfoController {

    @Autowired
    private MusicInfoService musicInfoService; // 注入音乐信息服务

    @Autowired
    private MusicLyricService musicLyricService; // 注入歌词服务

    @Autowired
    private MusicCommentService musicCommentService; // 注入评论服务

    /**
     * 根据音乐ID查询音乐详细信息。
     *
     * @param music_id 音乐的唯一标识符
     * @return 返回包含音乐详细信息的Result对象
     */
    @GetMapping("/details/{music_id}")
    public Result details(@PathVariable int music_id) {
        MusicDetailsVo musicDetailsVo = musicInfoService.findMusicById(music_id);
        //判断逻辑
        if (musicDetailsVo == null) {
            return Result.error("没有此歌曲");
        }else {
            return Result.success(musicDetailsVo);
        }
    }

    /**
     * 随机获取5条音乐信息，用于首页推荐。
     *
     * @return 返回随机的音乐信息列表
     */
    @GetMapping("/details/rand")
    public Result rand(Integer limit) {
        List<MusicDetailsVo> musicDetailsVo = musicInfoService.findRandMusic(limit);
        return Result.success(musicDetailsVo);
    }

    /**
     * 根据音乐ID查询对应的歌词信息。
     *
     * @param music_id 音乐的唯一标识符
     * @return 返回包含歌词信息的Result对象
     */
    @GetMapping("/lyric/{music_id}")
    public Result lyric(@PathVariable int music_id) {
        MusicLyric musicLyric = musicLyricService.getLyricById(music_id);
        return Result.success(musicLyric);
    }

    /**
     * 添加歌词信息。
     * @param musicLyric 需要添加的歌词信息对象
     * @return 添加结果
     */
    @PostMapping("/lyric/add")
    public Result addLyric(@ModelAttribute MusicLyric musicLyric) {
        MusicLyric musicLyric1 = musicLyricService.addLyric(musicLyric);
        if (musicLyric1 != null) {
            return Result.success(musicLyric1); // 返回更新后的音乐信息
        } else {
            return Result.error("服务器繁忙");
        }
    }

    /**
     * 插入单条音乐信息。
     * @param musicInfo 需要插入的音乐信息对象
     * @return 返回操作结果（成功或失败）
     */
    @PostMapping("/add")
    public Result add(@ModelAttribute MusicInfo musicInfo) {
        musicInfoService.insertOneMusic(musicInfo);
        if (musicInfo.getMusicImg() == null || musicInfo.getMusicUrl() == null
                || musicInfo.getMusicName() == null || musicInfo.getSinger() == null
                || musicInfo.getLabelId() == null || musicInfo.getMusicTime() == null) {
            return Result.error("新增失败，缺少必要字段");
        }
        return Result.success(musicInfo);
    }


    @DeleteMapping("/delete")
    public Result delete(@RequestParam Integer music_id) {
        MusicInfo musicInfo = musicInfoService.deleteMusicById(music_id);
        if (musicInfo != null) {
            return Result.success(musicInfo);
        }else {
            return Result.error("歌曲不存在");
        }
    }


    /**
     * 批量插入多条音乐信息。
     * @param musicInfos 包含多条音乐信息的列表
     * @return 返回操作结果（成功或失败）
     */
    @PostMapping("/addMany")
    public Result addMany(@RequestBody List<MusicInfo> musicInfos) {
        List<MusicInfo> result = musicInfoService.insertManyMusic(musicInfos);
        if (result.stream().count() > 0) {
            return Result.success(result);
        } else {
            return Result.error("服务器繁忙，新增失败");
        }
    }

    /**
     * 更新指定音乐的信息。
     *
     * @param musicInfo 包含更新数据的音乐信息对象
     * @return 返回操作结果（成功或失败）
     */
    @PutMapping("/update")
    public Result update(@ModelAttribute MusicInfo musicInfo) {
        MusicInfo musicInfo1 = musicInfoService.updateMusicById(musicInfo);
        if (musicInfo1 != null) {
            return Result.success(musicInfo1); // 返回更新后的音乐信息
        } else {
            return Result.error("服务器繁忙"); // 返回错误信息
        }
    }


    /**
     * 获取指定音乐的评论列表。
     *
     * @param musicId 音乐的唯一标识符
     * @return 评论列表
     */
    @GetMapping("/comment")
    public Result getComments(@RequestParam Integer musicId) {

        List<MusicComment> comments = musicCommentService.getCommentsByMusicId(musicId);
        if (comments != null) {
            return Result.success(comments); // 返回更新后的音乐信息
        } else {
            return Result.error("服务器繁忙"); // 返回错误信息
        }
    }

    /**
     * 添加评论
     * @param musicComment
     * @return
     */
    @PostMapping("/comment/add")
    public Result addComments(@ModelAttribute MusicComment musicComment) {

        MusicComment comments = musicCommentService.addCommentsByMusic(musicComment);
        if (comments != null) {
            return Result.success(comments); // 返回更新后的音乐信息
        } else {
            return Result.error("服务器繁忙"); // 返回错误信息
        }
    }


    // 定义一个GET请求的接口，用于根据标签ID随机获取音乐信息(用于模拟根据收藏量的热门音乐排行)
    @GetMapping("/random")
    public Result getRandomMusicByLabelId(
            // 从请求参数中获取标签ID，该参数是必需的，没有默认值
            @RequestParam Integer labelId) {
        // 调用服务层方法，根据标签ID获取与该标签相关的音乐信息列表
        List<MusicInfo> musicInfos = musicInfoService.getMusicsByLabelId(labelId);
        // 返回成功的结果，包含获取到的音乐信息列表
        // 这里假设musicInfos可能为空，但不会返回错误信息，而是直接返回空列表
        return Result.success(musicInfos);
    }

    /**
     * 获取排行榜的音乐信息
     * @return  排行榜列表
     */
    @GetMapping("/rankList")
    public Result getMusicsByClickCountDesc() {
        List<MusicInfo> musicInfos = musicInfoService.getMusicsByClickCountDesc();
        if (musicInfos != null){
            return Result.success(musicInfos);
        }else {
            return Result.error("服务器繁忙");
        }
    }
}
